package com.tyros.common.constant;

import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Arrays;

/**
 * 基本消息
 * 格式：
 * 基本格式为5位字符，前两位为业务场景编码，后三位为业务逻辑编码
 *
 * @author zhangshuaiyin
 * @date 2022-1-15 21:23:17
 */
@Getter
@AllArgsConstructor
public enum BaseMessage implements BaseCode {
    /**
     * 成功 00000
     */
    SUCCESS("00000", "操作成功"),
    /**
     * 系统异常 99999
     */
    SYSTEM_ERROR("99999", "系统异常, 请联系管理员"),

    /**
     * 全局系统消息 10xxx
     */
    INVALID_PARAM("10000", "请求参数异常, 请检查参数信息"),

    /**
     * 数据库消息 11xxx
     */
    DATABASE_ERROR("11000", "数据库操作异常"),
    DATABASE_SELECT_ERROR("11001", "数据库查询异常"),
    DATABASE_INSERT_ERROR("11002", "数据库新增异常"),
    DATABASE_UPDATE_ERROR("11003", "数据库更新异常"),
    DATABASE_DELETE_ERROR("11004", "数据库删除异常"),

    /**
     * 客户端 HTTP 状态码参考 {@link org.springframework.http.HttpStatus}
     */
    BAD_REQUEST("400", "请求参数不正确"),
    UNAUTHORIZED("401", "账号未登录"),
    FORBIDDEN("403", "没有该操作权限"),
    NOT_FOUND("404", "请求未找到"),
    METHOD_NOT_ALLOWED("405", "请求方法不正确"),
    // 并发请求，不允许
    LOCKED("423", "请求失败，请稍后重试"),
    TOO_MANY_REQUESTS("429", "请求过于频繁，请稍后重试"),
    // ========== 服务端错误段 ==========
    INTERNAL_SERVER_ERROR("500", "系统异常"),
    // ========== 自定义错误段 ==========
    // 重复请求
    REPEATED_REQUESTS("900", "重复请求，请稍后重试"),
    DEMO_DENY("901", "演示模式，禁止写操作"),
    UNKNOWN("999", "未知错误"),
    ;

    /**
     * 错误代码
     */
    private final String code;
    /**
     * 错误信息
     */
    private final String message;

    /**
     * 错误码映射枚举对象
     *
     * @param code 消息代码
     * @return 枚举对象
     */
    public static BaseMessage of(String code) {
        return Arrays.stream(BaseMessage.values())
                .filter(c -> c.equals(code))
                .findFirst()
                .orElse(null);
    }

    /**
     * @param code 消息编码
     * @return 是否存在错误代码
     */
    public boolean equals(String code) {
        return this.getCode().equals(code);
    }
}
